<?php

namespace common\extended\oss;

use OSS\OssClient;

class Functions
{
    protected $obj;

    protected $bucketname = 'meelier'; // OSS上面的bucke名称
    protected $accessKeyId = 'dUBfr1wNHjgMnJsd'; // OSS获得的AccessKeyId
    protected $accessKeySecret = '1U6ZSbOKhGBffxsopuMIKN6xCpSzUe'; // OSS获得的AccessKeySecret
    protected $endpoint = 'oss-cn-beijing.aliyuncs.com'; // OSS数据中心访问域名，例如oss-cn-hangzhou.aliyuncs.com

    public function __construct()
    {
        $this->obj = new OssClient($this->accessKeyId, $this->accessKeySecret, $this->endpoint);
    }

    /**
     * 这里只作为演示，使用需要修改
     * 上传至 bucket 里面的demo目录（无模型上传）
     *
     * @param string $fieldname input表单文件字段的名称
     * @return mixed 成功返回文件路径 如： demo/14496461425667d83e8031b.jpg
     */
    public function uploadDemo($fieldname, $path = 'demo')
    {
        if ($_FILES[$fieldname]['error'] === 0) {
            $filepath = $_FILES[$fieldname]['tmp_name'];
            $filename = $_FILES[$fieldname]['name'];

            return $this->upload('', $path, $filepath, $filename);
        } else {
            return false;
        }
    }
    /**
     * 上传编辑器图片
     * @date: 2016年3月21日 
     * @author: chenxiaolin
     */
    public function uploadPic($file,$fieldname,$path = 'demo')
    {
        if ($file[$fieldname]['error'] == 0) {
            $filepath = $file[$fieldname]['tmp_name'];
            $filename = $file[$fieldname]['name'];
            return $this->upload('', $path, $filepath, $filename);
        } else {
            return false;
        }
    }
    /**
     * 上传编辑器图片2
     * @date: 2016年3月21日 
     * @author: chenxiaolin
     */
    public function uploadUeditorPic($filepath,$filename,$path = 'demo'){
        return $this->upload('', $path, $filepath, $filename);
    }

    /**
     * 多文件上传
     * @param $fileName
     * @param string $path
     * @return bool|string
     */
    public function uploadFiles($fileName, $path = 'demo')
    {
        $file_num = count($_FILES[$fileName]['error']);

        for ($i = 0; $i < $file_num; $i++) {
            $_FILES[$i]['name'] = $_FILES[$fileName]['name'][$i];
            $_FILES[$i]['type'] = $_FILES[$fileName]['type'][$i];
            $_FILES[$i]['tmp_name'] = $_FILES[$fileName]['tmp_name'][$i];
            $_FILES[$i]['error'] = $_FILES[$fileName]['error'][$i];
            $_FILES[$i]['size'] = $_FILES[$fileName]['size'][$i];

            if ($_FILES[$i]['error'] === 0) {
                $filepath = $_FILES[$i]['tmp_name'];
                $filename = $_FILES[$i]['name'];

                $arr[] = $this->upload('', $path, $filepath, $filename);
            } else {
                return false;
            }
        }
        return implode(',',$arr);
    }

    /**
     * 这里只作为演示，使用需要修改
     * 上传至 bucket 里面的demo目录（Yii自带的form组件的模型上传）
     *
     * @param string $modelname 模型的名称
     * @param string $fieldname input表单文件字段的名称
     * @return mixed 成功返回文件路径 如： demo/14496461425667d83e8031b.jpg
     */
    public function uploadDemoModel($modelname, $fieldname)
    {
        if ($_FILES[$modelname]['error'][$fieldname] === 0) {
            $filepath = $_FILES[$modelname]['tmp_name'][$fieldname];
            $filename = $_FILES[$modelname]['name'][$fieldname];

            return $this->upload('', 'demo', $filepath, $filename);
        } else {
            return false;
        }
    }

    /**
     * 上传文件的处理
     * @param string $bucketname OSS的bucket名称
     * @param string $objDir bucket里面存在的目录名称 [ 不存在会自己创建 ]
     * @param string $filepath 上传文件的临时路径（如：$_FILES['LoginForm']['tmp_name']['image']）
     * @param string $filename 上传文件的临时名称（如：$_FILES['LoginForm']['name']['image']）
     * @throws \OSS\Core\OssException
     *
     * @return mixed [ demo/14496461425667d83e8031b.jpg ]
     */
    protected function upload($bucketname, $objDir, $filepath, $filename)
    {
        $objDir = empty($objDir) ? '' : $objDir . '/';
        $filename = $objDir . $this->createFileName($filename);

        if (empty($bucketname)) $bucketname = $this->bucketname;

        $this->obj->uploadFile($bucketname, $filename, $filepath);
        return $filename; // 上传成功的文件名称
    }

    /**
     * 生成文件名
     * @param string $filename 原文件名
     * @return mixed
     */
    protected function createFileName($filename)
    {
        $hz = explode('.', $filename);
        $hz = end($hz);

        return uniqid(time()) . '.' . $hz;
    }

}

